#include<cstdio>
#include<cstring>
#include<iostream>
#include<vector>
using namespace std;
const int maxn=210;
int f[maxn][maxn],n,m,v[maxn],p[maxn];
vector<int> son[maxn];
int min(int x,int y){return x<y?x:y;}
int max(int x,int y){return x>y?x:y;}
void dfs(int root)
{
    int k=son[root].size();
    if(k==0)
    {
        f[root][1]=v[root];
        return;
    }
    for(int t=0;t<k;t++)
    {
        int s=son[root][t];
        dfs(s);
        for(int j=m;j>=1;j--)
        {
            for(int i=1;i<=j;i++)
                f[root][j]=max(f[root][j],f[s][i]+f[root][j-i]);
        }
    }
    if(root!=0)
    {
        for(int j=m;j>=1;j--)
            f[root][j]=f[root][j-1]+v[root];
    }
}
int main()
{
    while(scanf("%d%d",&n,&m)!=EOF)
    {
		memset(p,0,sizeof(p));
        for(int i=0;i<=n;i++)son[i].clear();
		for(int i=1;i<=n;i++)scanf("%d",&v[i]);
        for(int i=1;i<n;i++)
        {
            int x,y;
            scanf("%d%d",&x,&y);
			++x;++y;
			if(p[x]!=0)
			{
				p[y]=x;
				son[x].push_back(y);
			}
			else
			{
				p[x]=y;
				son[y].push_back(x);
			}
        }
		int r=0;
		for(int i=1;i<=n;i++)
			if(p[i]==0){r=i;break;}
        memset(f,0,sizeof(f));
        dfs(r);
		int ans=0;
		for(int i=1;i<=n;i++)ans=max(ans,f[i][m]);
        cout<<ans<<endl;
    }
    return 0;
}

